home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <signal.h>
- #if ! defined(vax)
- # include <netinet/in.h>
- #endif
- #include "sokoban.h"
-
- extern char *malloc();
- extern FILE *fopen();
-
- extern char *username;
- extern char map[MAXROW + 1][MAXCOL + 1];
- extern short level, moves, pushes, packets, savepack, rows, cols;
- extern POS ppos;
-
- static long savedbn;
- static char *sfname;
- static FILE *savefile;
- static struct stat sfstat;
-
- short
- savegame()
- {
-
- short ret = 0;
-
- signal(SIGINT, SIG_IGN);
- sfname = malloc(strlen(SAVEPATH) + strlen(username) + 6);
- sprintf(sfname, "%s/%s.sav", SAVEPATH, username);
- #ifdef __MSDOS__
- if ((savefile = fopen(sfname, "wb")) == NULL)
- ret = E_FOPENSAVE;
- else {
- if (fwrite(map, 1, MAXROW * MAXCOL, savefile) != MAXROW * MAXCOL)
- ret = E_WRITESAVE;
- else if (fwrite(&ppos, 1, sizeof(POS), savefile) != sizeof(POS))
- ret = E_WRITESAVE;
- else if (fwrite(&level, 1, 2, savefile) != 2)
- ret = E_WRITESAVE;
- else if (fwrite(&moves, 1, 2, savefile) != 2)
- ret = E_WRITESAVE;
- else if (fwrite(&pushes, 1, 2, savefile) != 2)
- ret = E_WRITESAVE;
- else if (fwrite(&packets, 1, 2, savefile) != 2)
- ret = E_WRITESAVE;
- else if (fwrite(&savepack, 1, 2, savefile) != 2)
- ret = E_WRITESAVE;
- else if (fwrite(&rows, 1, 2, savefile) != 2)
- ret = E_WRITESAVE;
- else if (fwrite(&cols, 1, 2, savefile) != 2)
- ret = E_WRITESAVE;
- else {
- fclose(savefile);
- if (stat(sfname, &sfstat) != 0)
- ret = E_STATSAVE;
- else if ((savefile = fopen(sfname, "ab")) == NULL)
- ret = E_FOPENSAVE;
- else {
- if (fwrite(&sfstat, 1, sizeof(sfstat), savefile) != sizeof(sfstat))
- ret = E_WRITESAVE;
- #else
- packets = htons(packets);
- pushes = htons(pushes);
- moves = htons(moves);
- level = htons(level);
- cols = htons(cols);
- savepack = htons(savepack);
- rows = htons(rows);
- ppos.x = htons(ppos.x);
- ppos.y = htons(ppos.y);
- if ((savefile = fopen(sfname, "w")) == NULL)
- ret = E_FOPENSAVE;
- else {
- savedbn = fileno(savefile);
- if (write(savedbn, &(map[0][0]), MAXROW * MAXCOL) != MAXROW * MAXCOL)
- ret = E_WRITESAVE;
- else if (write(savedbn, &ppos, sizeof(POS)) != sizeof(POS))
- ret = E_WRITESAVE;
- else if (write(savedbn, &level, 2) != 2)
- ret = E_WRITESAVE;
- else if (write(savedbn, &moves, 2) != 2)
- ret = E_WRITESAVE;
- else if (write(savedbn, &pushes, 2) != 2)
- ret = E_WRITESAVE;
- else if (write(savedbn, &packets, 2) != 2)
- ret = E_WRITESAVE;
- else if (write(savedbn, &savepack, 2) != 2)
- ret = E_WRITESAVE;
- else if (write(savedbn, &rows, 2) != 2)
- ret = E_WRITESAVE;
- else if (write(savedbn, &cols, 2) != 2)
- ret = E_WRITESAVE;
- else
- fclose(savefile);
- if (stat(sfname, &sfstat) != 0)
- ret = E_STATSAVE;
- else if ((savefile = fopen(sfname, "a")) == NULL)
- ret = E_FOPENSAVE;
- else if (write(savedbn, &sfstat, sizeof(sfstat)) != sizeof(sfstat))
- ret = E_WRITESAVE;
- #endif
- fclose(savefile);
- }
- #ifndef __MSDOS__
- ppos.x = ntohs(ppos.x);
- ppos.y = ntohs(ppos.y);
- pushes = ntohs(pushes);
- moves = ntohs(moves);
- level = ntohs(level);
- packets = ntohs(packets);
- cols = ntohs(cols);
- rows = ntohs(rows);
- savepack = ntohs(savepack);
- #endif
-
- if ((ret == E_WRITESAVE) || (ret == E_STATSAVE))
- unlink(sfname);
- signal(SIGINT, SIG_DFL);
-
- return (ret);
- }
-
- short
- restoregame()
- {
-
- short ret = 0;
- struct stat oldsfstat;
-
- signal(SIGINT, SIG_IGN);
- sfname = malloc(strlen(SAVEPATH) + strlen(username) + 6);
- sprintf(sfname, "%s/%s.sav", SAVEPATH, username);
- #ifdef __MSDOS__
- if (stat(sfname, &oldsfstat) < -1)
- ret = E_NOSAVEFILE;
- else {
- if ((savefile = fopen(sfname, "rb")) == NULL)
- ret = E_FOPENSAVE;
- else {
- if (fread(map, 1, MAXROW * MAXCOL, savefile) != MAXROW * MAXCOL)
- ret = E_READSAVE;
- else if (fread(&ppos, 1, sizeof(POS), savefile) != sizeof(POS))
- ret = E_READSAVE;
- else if (fread(&level, 1, 2, savefile) != 2)
- ret = E_READSAVE;
- else if (fread(&moves, 1, 2, savefile) != 2)
- ret = E_READSAVE;
- else if (fread(&pushes, 1, 2, savefile) != 2)
- ret = E_READSAVE;
- else if (fread(&packets, 1, 2, savefile) != 2)
- ret = E_READSAVE;
- else if (fread(&savepack, 1, 2, savefile) != 2)
- ret = E_READSAVE;
- else if (fread(&rows, 1, 2, savefile) != 2)
- ret = E_READSAVE;
- else if (fread(&cols, 1, 2, savefile) != 2)
- ret = E_READSAVE;
- else if (fread(&sfstat, 1, sizeof(sfstat), savefile) != sizeof(sfstat))
- #else
- if (stat(sfname, &oldsfstat) < -1)
- ret = E_NOSAVEFILE;
- else {
- if ((savefile = fopen(sfname, "r")) == NULL)
- ret = E_FOPENSAVE;
- else {
- savedbn = fileno(savefile);
- if (read(savedbn, &(map[0][0]), MAXROW * MAXCOL) != MAXROW * MAXCOL)
- ret = E_READSAVE;
- else if (read(savedbn, &ppos, sizeof(POS)) != sizeof(POS))
- ret = E_READSAVE;
- else if (read(savedbn, &level, 2) != 2)
- ret = E_READSAVE;
- else if (read(savedbn, &moves, 2) != 2)
- ret = E_READSAVE;
- else if (read(savedbn, &pushes, 2) != 2)
- ret = E_READSAVE;
- else if (read(savedbn, &packets, 2) != 2)
- ret = E_READSAVE;
- else if (read(savedbn, &savepack, 2) != 2)
- ret = E_READSAVE;
- else if (read(savedbn, &rows, 2) != 2)
- ret = E_READSAVE;
- else if (read(savedbn, &cols, 2) != 2)
- ret = E_READSAVE;
- else if (read(savedbn, &sfstat, sizeof(sfstat)) != sizeof(sfstat))
- #endif
- ret = E_READSAVE;
- }
- ppos.x = ntohs(ppos.x);
- ppos.y = ntohs(ppos.y);
- level = ntohs(level);
- moves = ntohs(moves);
- pushes = ntohs(pushes);
- packets = ntohs(packets);
- savepack = ntohs(savepack);
- rows = ntohs(rows);
- cols = ntohs(cols);
-
- unlink(sfname);
- }
- signal(SIGINT, SIG_DFL);
- return (ret);
- }
-